package net.mcreator.playerhealth;

import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.event.entity.living.LivingDeathEvent;
import net.neoforged.neoforge.event.entity.player.PlayerEvent;
import net.neoforged.neoforge.event.tick.PlayerTickEvent;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.damagesource.DamageTypes;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
import net.minecraft.server.level.ServerPlayer;
import java.util.Collections;

@EventBusSubscriber
public class PlayerDeathHandler {

    @SubscribeEvent
    public static void onPlayerDeath(LivingDeathEvent event) {
        if (event.getEntity() instanceof Player player) {
            if (event.getSource().is(DamageTypes.FALL)) return;
            if (player.getPersistentData().getBoolean("deathPrevented")) return;
            event.setCanceled(true);
            MinecraftServer server = player.level().getServer();
            if (server != null) {
                server.execute(() -> {
                    player.setHealth(player.getMaxHealth());
                    player.getPersistentData().putBoolean("deathPrevented", true);
                    player.getPersistentData().putBoolean("fallan", true);
                    player.getPersistentData().putFloat("frozenYaw", player.getYRot());
                    player.getPersistentData().putFloat("frozenPitch", player.getXRot());
                    setPlayerFrozen(player, true);
                });
            }
        }
    }

    @SubscribeEvent
    public static void onPlayerTick(PlayerTickEvent.Post event) {
        Player player = event.getEntity();
        if (player.getPersistentData().getBoolean("fallan")) {
            // تثبيت اللاعب والكاميرا
            float frozenYaw = player.getPersistentData().getFloat("frozenYaw");
            float frozenPitch = player.getPersistentData().getFloat("frozenPitch");
            
            player.setYRot(frozenYaw);
            player.setXRot(frozenPitch);
            player.setYHeadRot(frozenYaw);
            player.yBodyRot = frozenYaw;
            
            if (player instanceof ServerPlayer serverPlayer) {
                serverPlayer.connection.teleport(serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ(), frozenYaw, frozenPitch, Collections.emptySet());
            }
        }
    }

    @SubscribeEvent
    public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) {
        Player player = event.getEntity();
        player.getPersistentData().putBoolean("deathPrevented", false);
        player.getPersistentData().putBoolean("fallan", false);
        setPlayerFrozen(player, false);
    }

    public static void setPlayerFrozen(Player player, boolean frozen) {
        AttributeInstance speed = player.getAttribute(Attributes.MOVEMENT_SPEED);
        AttributeInstance jump = player.getAttribute(Attributes.JUMP_STRENGTH);
        if (speed != null) speed.setBaseValue(frozen ? 0.0D : 0.1D);
        if (jump != null) jump.setBaseValue(frozen ? 0.0D : 0.42D);
    }
}